#ifndef RAFT_CORE_APPLY_MSG_H
#define RAFT_CORE_APPLY_MSG_H

#include <string>

namespace raftCore {

class ApplyMsg {
/**
 * @brief 封装Raft协议中需要应用到状态机的消息
 * 
 * 该消息可能包含两种类型的数据：
 * 1. 待执行的日志命令（当CommandValid为true时）
 * 2. 快照数据（当SnapshotValid为true时）
 * 两种类型互斥，同一时间只有一种数据有效
 */
public:
    /**
     * @brief 构造函数，初始化成员变量
     * 
     * 确保CommandValid和SnapshotValid初始化为false（互斥无效状态），
     * 索引和任期初始化为-1（无效值）
     */
    ApplyMsg()
    : CommandValid(false),  // 初始化命令有效性标记为false
      Command(),            // 初始化命令内容为空字符串
      CommandIndex(-1),     // 初始化命令索引为无效值-1
      SnapshotValid(false), // 初始化快照有效性标记为false
      Snapshot(),           // 初始化快照数据为空字符串
      SnapshotTerm(-1),     // 初始化快照任期为无效值-1
      SnapshotIndex(-1)     // 初始化快照索引为无效值-1
    {}

public:
    bool CommandValid;      // 标记当前消息是否包含有效的日志命令（true表示包含有效命令）
    std::string Command;    // 日志命令内容，仅当CommandValid为true时有效
    int CommandIndex;       // 命令对应的日志条目索引，仅当CommandValid为true时有效

    bool SnapshotValid;     // 标记当前消息是否包含有效的快照数据（true表示包含有效快照）
    std::string Snapshot;   // 快照数据内容，仅当SnapshotValid为true时有效
    int SnapshotTerm;       // 快照对应的任期号，仅当SnapshotValid为true时有效
    int SnapshotIndex;      // 快照覆盖的最大日志索引，仅当SnapshotValid为true时有效
};

}   // namespace raftCore

#endif  // RAFT_CORE_APPLY_MSG_H